#ifndef CUSTOMERUI_H
#define CUSTOMERUI_H

#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QComboBox>
#include <QSpinBox>
#include <QScrollArea>
#include <QFrame>
#include <QGroupBox>
#include <QListWidget>
#include <QTableWidget>
#include <QHeaderView>
#include <QMessageBox>
#include <QTimer>
#include <QPixmap>
#include <QProgressBar>
#include "../business/menumanager.h"
#include "../data/datamanager.h"
#include "../data/models.h"
#include "../utils/filehandler.h"

// 使用命名空间
using namespace RestaurantSystem;

/**
 * @brief 顾客端菜单浏览界面类
 * 
 * 提供顾客菜单浏览功能，包括：
 * - 菜单展示和分类浏览
 * - 搜索和过滤功能
 * - 菜品详情查看
 * - 添加到购物车功能
 * - 分页浏览支持
 */
class CustomerMenuUI : public QWidget
{
    Q_OBJECT

public:
    explicit CustomerMenuUI(QWidget *parent = nullptr);
    ~CustomerMenuUI();

    /**
     * @brief 设置菜单管理器
     * @param menuManager 菜单管理器指针
     */
    void setMenuManager(MenuManager *menuManager);

    /**
     * @brief 刷新菜单数据
     */
    void refreshMenuData();

    /**
     * @brief 设置当前用户ID
     * @param userId 用户ID
     */
    void setCurrentUserId(int userId);

signals:
    /**
     * @brief 添加到购物车信号
     * @param itemId 菜品ID
     * @param quantity 数量
     */
    void addToCartRequested(const QString &itemId, int quantity);

    /**
     * @brief 查看购物车信号
     */
    void viewCartRequested();

private slots:
    /**
     * @brief 处理搜索
     */
    void handleSearch();

    /**
     * @brief 处理分类过滤
     */
    void handleCategoryFilter();

    /**
     * @brief 处理价格排序
     */
    void handlePriceSort();

    /**
     * @brief 处理菜品详情查看
     */
    void handleItemDetails();

    /**
     * @brief 处理添加到购物车
     */
    void handleAddToCart();

    /**
     * @brief 处理分页导航
     */
    void handlePageNavigation();

    /**
     * @brief 清除搜索
     */
    void clearSearch();

    /**
     * @brief 刷新数据
     */
    void refreshData();

    /**
     * @brief 处理查看购物车
     */
    void handleViewCart();
    
    /**
     * @brief 处理库存更新
     */
    void onStockUpdated(const QString& itemId, int oldStock, int newStock);
    
    /**
     * @brief 处理菜单项更新
     */
    void onMenuItemUpdated(const MenuItem& item);
    
    /**
     * @brief 处理分类变更
     */
    void onCategoriesChanged(const QStringList& categories);
    
    /**
     * @brief 处理外部文件变更（跨进程数据同步）
     */
    void onExternalFileChanged(DataType dataType, const QString& filePath);

private:
    /**
     * @brief 初始化界面
     */
    void initializeUI();

    /**
     * @brief 创建搜索区域
     */
    void createSearchArea();

    /**
     * @brief 创建过滤区域
     */
    void createFilterArea();

    /**
     * @brief 创建菜单显示区域
     */
    void createMenuDisplayArea();

    /**
     * @brief 创建分页区域
     */
    void createPaginationArea();

    /**
     * @brief 应用样式表
     */
    void applyStyleSheet();

    /**
     * @brief 加载菜单数据
     */
    void loadMenuData();

    /**
     * @brief 显示菜单项
     * @param items 菜单项列表
     */
    void displayMenuItems(const QList<MenuItem> &items);

    /**
     * @brief 创建菜品卡片
     * @param item 菜品信息
     * @return 菜品卡片widget
     */
    QWidget* createMenuItemCard(const MenuItem &item);

    /**
     * @brief 过滤菜单项
     * @return 过滤后的菜单项列表
     */
    QList<MenuItem> filterMenuItems();

    /**
     * @brief 更新分页信息
     */
    void updatePaginationInfo();
    
    /**
     * @brief 更新特定菜品的库存显示
     * @param itemId 菜品ID
     * @param newStock 新库存
     */
    void updateMenuItemStock(const QString& itemId, int newStock);
    
    /**
     * @brief 更新特定菜品卡片的显示
     * @param item 菜品信息
     */
    void updateMenuItemCard(const MenuItem& item);

    /**
     * @brief 显示菜品详情对话框
     * @param item 菜品信息
     */
    void showItemDetailsDialog(const MenuItem &item);

    /**
     * @brief 设置界面启用状态
     * @param enabled 是否启用
     */
    void setUIEnabled(bool enabled);

private:
    // 业务管理器
    MenuManager *m_menuManager;

    // 用户信息
    int m_currentUserId;

    // 主布局
    QVBoxLayout *m_mainLayout;

    // 搜索区域
    QHBoxLayout *m_searchLayout;
    QLineEdit *m_searchEdit;
    QPushButton *m_searchButton;
    QPushButton *m_clearButton;

    // 过滤区域
    QHBoxLayout *m_filterLayout;
    QComboBox *m_categoryCombo;
    QComboBox *m_sortCombo;
    QLabel *m_resultLabel;
    QPushButton *m_viewCartButton;

    // 菜单显示区域
    QScrollArea *m_scrollArea;
    QWidget *m_menuContainer;
    QGridLayout *m_menuLayout;

    // 分页区域
    QHBoxLayout *m_paginationLayout;
    QPushButton *m_prevButton;
    QPushButton *m_nextButton;
    QLabel *m_pageLabel;
    QComboBox *m_pageSizeCombo;

    // 数据
    QList<MenuItem> m_allMenuItems;
    QList<MenuItem> m_filteredItems;
    QStringList m_categories;

    // 分页信息
    int m_currentPage;
    int m_pageSize;
    int m_totalPages;

    // 界面状态
    QString m_currentSearchText;
    QString m_currentCategory;
    QString m_currentSortOrder;

    // 加载指示器
    QProgressBar *m_loadingBar;
    QLabel *m_loadingLabel;
};

/**
 * @brief 菜品详情对话框类
 */
class MenuItemDetailsDialog : public QDialog
{
    Q_OBJECT

public:
    explicit MenuItemDetailsDialog(const MenuItem &item, QWidget *parent = nullptr);

    /**
     * @brief 获取选择的数量
     * @return 数量
     */
    int getSelectedQuantity() const;

signals:
    /**
     * @brief 添加到购物车信号
     * @param quantity 数量
     */
    void addToCartRequested(int quantity);

private slots:
    /**
     * @brief 处理添加到购物车
     */
    void handleAddToCart();

private:
    /**
     * @brief 初始化界面
     */
    void initializeUI();

    /**
     * @brief 应用样式表
     */
    void applyStyleSheet();
    
    /**
     * @brief 更新数量控件状态
     */
    void updateQuantityControls();
    
    /**
     * @brief 更新加入购物车按钮状态
     */
    void updateAddToCartButtonState();

private slots:
    /**
     * @brief 处理数量增加
     */
    void handleIncreaseQuantity();
    
    /**
     * @brief 处理数量减少
     */
    void handleDecreaseQuantity();

private:
    MenuItem m_menuItem;
    QVBoxLayout *m_mainLayout;
    QScrollArea *m_scrollArea;
    QWidget *m_contentWidget;
    QVBoxLayout *m_contentLayout;
    QLabel *m_nameLabel;
    QLabel *m_descriptionLabel;
    QLabel *m_priceLabel;
    QLabel *m_categoryLabel;
    QLabel *m_salesLabel;
    QLabel *m_stockLabel;
    
    // 数量控制组件
    QPushButton *m_decreaseButton;
    QLabel *m_quantityLabel;
    QPushButton *m_increaseButton;
    int m_currentQuantity;
    
    QPushButton *m_addButton;
    QPushButton *m_cancelButton;
};

#endif // CUSTOMERUI_H
